package com.mxgraph.examples.swing.editor;

import com.editor.utils.EquivalentCircuit;
import com.editor.utils.ParamsAndCondsTableModel;
import com.editor.utils.parser.ParsToValues;
import com.editor.utils.parser.ValuesForParametersAndConditions;

import javax.swing.*;
import javax.swing.border.TitledBorder;
import java.awt.*;
import java.awt.event.*;
import java.util.HashMap;

import static com.mxgraph.examples.swing.editor.EditorActions.EditAction.getData;
import static com.mxgraph.examples.swing.editor.EditorActions.EditAction.writeInGraph;

//Класс диалога редактирования для всех элементов. Если кто-то хочет добавить/удалить/переместить
//элементы интерфейса - желательно делать это в .form файле.
//TODO Надо поправить интерфейс окна редактирования 1)Если таблица одна она располагается не по центру
public class EditDialog extends JDialog {
    private JPanel contentPane;
    private JButton buttonOK;
    private JButton buttonCancel;
    private JComboBox<ComboBoxObj> comboBox1;
    private JTable table1;
    private JTable table2;
    private JLabel imageLabel;
    private JPanel paramPanel;
    private JPanel condPanel;
    private JTextPane textPane1;

    private String currentStyle;

    public EditDialog() {
        setTitle("Редактирование элемента");
        //TODO положение окна редактирования должно быть относительно элемента по которому кликают
        imageLabel.setText("");
        setContentPane(contentPane);
        setModal(true);
        getRootPane().setDefaultButton(buttonOK);
        //TODO потом вернуть эту панель
        textPane1.setVisible(false);
        textPane1.setEditable(false);
        textPane1.setText("Комменты комменты и еще раз комменты...");
        textPane1.setOpaque(false);
        textPane1.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.black),
                BorderFactory.createEmptyBorder(2, 2, 2, 2)));
        table1.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
        table2.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);

        buttonOK.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                onOK();
            }
        });

        buttonCancel.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                onCancel();
            }
        });

// call onCancel() when cross is clicked
        setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                onCancel();
            }
        });

// call onCancel() on ESCAPE
        contentPane.registerKeyboardAction(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                onCancel();
            }
        }, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);

    }

    private void onOK() {
        //Запись значения в граф cell.setValue

        writeInGraph(table1, table2, comboBox1.getSelectedItem().toString());
        dispose();
    }

    private void onCancel() {
// add your code here if necessary
        dispose();
    }

    public void setComboBox(JComboBox<ComboBoxObj> newComboBox) {
        comboBox1.setModel(newComboBox.getModel());
        comboBox1.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent arg0) {
                if (arg0.getStateChange() == ItemEvent.SELECTED)
                {
                    String selectedScheme = comboBox1.getSelectedItem().toString();
                    EditorActions.EditAction.getDefaultTableValues(selectedScheme, currentStyle, EditDialog.this);
                }
            }
        });
    }

    private void setParamsTable(ParamsAndCondsTableModel newTable) {
        table1.setModel(newTable);
    }

    private void setCondTable(ParamsAndCondsTableModel newTable) {
        table2.setModel(newTable);
    }

    public void setData(String style, String newScheme) {
        //Сохраняем какую схему выбрал пользователь в списке чтобы использовать её позже
        ParamsAndCondsTableModel.current = newScheme;
        currentStyle = style;

        //Почему-то ставит картинку только через setIcon
        JLabel label1 = EquivalentCircuit.getImage(style,
                EditorActions.EditAction.class);
        imageLabel.setIcon(label1.getIcon());

        ParsToValues valueData = new ParsToValues(getData());
        comboBox1.setSelectedItem(new ComboBoxObj(newScheme));

        //Если таблица не пуста добавляем её в диалог
        HashMap<Integer, ValuesForParametersAndConditions> paramMap = valueData.getHashMapForValuesParameters();
        if (paramMap.size() != 0) {
            paramPanel.setBorder(BorderFactory.createTitledBorder (BorderFactory.createEtchedBorder (),
                    "Параметры",
                    TitledBorder.CENTER,
                    TitledBorder.TOP));
            setParamsTable(new ParamsAndCondsTableModel(paramMap));
        }
        else
            this.remove(paramPanel);

        //Если таблица не пуста добавляем её в диалог
        HashMap<Integer, ValuesForParametersAndConditions> condMap = valueData.getHashMapForValuesConditions();
        if (condMap.size() != 0) {
            condPanel.setBorder(BorderFactory.createTitledBorder (BorderFactory.createEtchedBorder (),
                    "Начальные условия",
                    TitledBorder.CENTER,
                    TitledBorder.TOP));

            setCondTable(new ParamsAndCondsTableModel(condMap));
        }
        else
            this.remove(condPanel);
        pack();
    }

}






